使用Vert.x实现反向代理

1. 前言
在简单使用Pingora后,我在想既然rust, go都能写代理相关,那为什么不用Java写一个呢?
搜了搜原来用Vert.x实现反向代理这么简单,让我们快速开始吧。
如果你想下载示例代码,可以在这里找到:demo-vertx-reverse-proxy
2. 创建Vert.x项目
Vert.x项目的创建可以在官网找到:Create a new Vert.x application
要选择的依赖则是Vert.x Http Proxy

3. 根据Vert.x的 教程开始
官网的教程:Vert.x Http Proxy
3.1 Vert.x Http Proxy
Vert.x Http Proxy 是基于 Vert.x 的反向代理,它旨在实现可重用的反向代理逻辑,以关注更高的问题。
该模块具有技术预览状态,这意味着 API 可以在版本之间更改。
3.2 使用 Vert.x Http Proxy
要使用 Vert.x Http Proxy,请在pom.xml或是其他依赖配置中增加:
- Maven
- Gradle
<dependency>
<groupId>io.vertx</groupId>
<artifactId>vertx-http-proxy</artifactId>
<version>4.1.8</version>
</dependency>
dependencies {
compile 'io.vertx:vertx-http-proxy:4.1.8'
}
3.3 基本 Http 代理
为了使用 Vert.x Http Proxy 完成反向代理,你需要以下内容:
- 代理服务器使用 HttpProxy 实例处理出站请求并将其转发给源服务器。
- 源服务器处理来自代理服务器的请求并相应地处理响应。
现在,你已经有了总体概念,所以让我们深入实现并从源服务器开始,然后是带有 HttpProxy 的代理服务器:
3.4 源服务
提示
这里可以跳过,因为源服务我们可以直接使用任意你能打开的网站的链接
当然我还是保留了完整步骤。
你只需创建监听端口 7070 的源服务器
@Override
public void start(Promise<Void> startPromise) throws Exception {
HttpServer originServer = vertx.createHttpServer();
originServer.requestHandler(req -> {
req.response()
.putHeader("content-type", "text/html")
.end("<html><body><h1>I'm the target resource!</h1></body></html>");
}).listen(7070);
}
3.5 使用 HttpProxy 的代理服务器
使用 HttpProxy 实例创建侦听端口 8080 的代理服务器,该实例相应地处理反向代理逻辑。
@Override
public void start(Promise<Void> startPromise) throws Exception {
HttpClient proxyClient = vertx.createHttpClient();
HttpProxy proxy = HttpProxy.reverseProxy(proxyClient);
proxy.origin(7070, "origin");
HttpServer proxyServer = vertx.createHttpServer();
proxyServer.requestHandler(proxy).listen(8080);
}
最后,所有向外发出的请求都将作为反向代理方便地转发给源服务器。
官方教程到这里就结束了,只是代理某个ip+端口的服务,但是如果想代理某个网站呢?